package gui;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.filechooser.FileNameExtensionFilter;

import linguo.Data;
import linguo.sprites.BufferedImageLoader;
import linguo.sprites.SpriteSheet;

public class PanelOpciones extends JPanel {
	private static final long serialVersionUID = 1L;

	protected JLabel lblNivel, lblRobot, lblSkin, lblDibujo,lblArchivo;
	protected ButtonGroup groupRobots;
	protected JRadioButton militarButton, civilButton;
	protected JComboBox<String> cboNiveles, cboSkins;
	protected int robot;
	protected JButton btnStartGame, btnCargar;
	protected VentanaPrincipal ventana;
	protected boolean cargoDeArchivo;
	protected File archivo;

	protected BufferedImageLoader loader;

	public PanelOpciones(VentanaPrincipal v) {
		loader = new BufferedImageLoader();
		Data.SPRITE_SHEET = new SpriteSheet(loader.loadImage("/resources/SpriteSheets/Default.png"));
		Data.SPRITE_SIZE = 32;
		robot = 1;
		ventana = v;

		//Labels
		lblNivel = new JLabel("Nivel");
		lblNivel.setFont(new Font("Tahoma", 0, 18));
		lblRobot = new JLabel("Personaje");
		lblRobot.setFont(new Font("Tahoma", 0, 18));
		lblSkin = new JLabel("Skin");
		lblSkin.setFont(new Font("Tahoma", 0, 18));
		lblDibujo = new JLabel();
		lblDibujo.setIcon(new ImageIcon(Data.SPRITE_SHEET.grabImage(1, 0)));
		lblArchivo = new JLabel();
		lblArchivo.setFont(new Font("Tahoma", 0, 14));

		// Radio Buttons
		militarButton = new JRadioButton("Militar");
		civilButton = new JRadioButton("Civil");

		// Grupos de botones
		ButtonGroup groupRobots = new ButtonGroup();
		militarButton.setSelected(true);

		groupRobots.add(militarButton);
		groupRobots.add(civilButton);

		// Combo Box
		cboNiveles = new JComboBox<String>();
		cboNiveles.setModel(new DefaultComboBoxModel<String>(new String[] { "Default", "Laberinto", "Lienzo", "De archivo" }));
		cboSkins = new JComboBox<String>();
		cboSkins.setModel(new DefaultComboBoxModel<String>(new String[] { "Default", "Pokemon" }));

		//Botones
		btnStartGame = new JButton("Empezar");
		btnCargar = new JButton("Cargar de Archivo");

		//Armo el panel
		this.add(lblNivel);
		this.add(lblArchivo);
		this.add(lblRobot);
		this.add(lblSkin);
		this.add(militarButton);
		this.add(civilButton);
		this.add(cboSkins);
		this.add(cboNiveles);
		this.add(lblDibujo);
		this.add(btnStartGame);
		this.add(btnCargar);

		lblNivel.setBounds(220, 110, 100, 30);
		lblArchivo.setBounds(700, 110, 100, 30);
		cboNiveles.setBounds(350, 110, 100, 30);

		lblSkin.setBounds(220, 180, 100, 30);
		cboSkins.setBounds(350, 180, 100, 30);

		lblRobot.setBounds(200, 340, 100, 30);
		militarButton.setBounds(330, 340, 100, 30);
		civilButton.setBounds(430, 340, 100, 30);
		lblDibujo.setBounds(550, 340, 32, 32);

		btnStartGame.setBounds(350, 450, 100, 30);
		btnCargar.setBounds(500, 110, 150, 30);
		btnCargar.setEnabled(false);

		addListeners();
	}

	/**
	 * Agrega listeners a los botones
	 */
	private void addListeners() {

		militarButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				botonMilitar();
			}
		});

		civilButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				botonCivil();
			}
		});

		btnStartGame.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				startGame();
			}
		});

		btnCargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cargarArchivo();
			}
		});

		cboSkins.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cambiarSkin();
			}

		});
		
		cboNiveles.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (cboNiveles.getSelectedItem()=="De archivo")
					{btnCargar.setEnabled(true);
					lblArchivo.setVisible(true);
					}
				
				else{
					btnCargar.setEnabled(false);
					lblArchivo.setVisible(false);}
			}

		});

	}

	/**
	 * Cambia el label dependiendo del robot seleccionado
	 */
	private void botonMilitar() {
		lblDibujo.setIcon(new ImageIcon(Data.SPRITE_SHEET.grabImage(1, 0)));
		robot = 1;
	}

	/**
	 * Cambia el label dependiendo del robot seleccionado
	 */
	private void botonCivil() {
		lblDibujo.setIcon(new ImageIcon(Data.SPRITE_SHEET.grabImage(5, 0)));
		robot = 0;
	}

	/** Devuelve el tipo de robot seleccionado
	 * 
	 * @return robot
	 */
	public int getRobot() {
		return robot;
	}

	/** Empieza el juego
	 * 
	 */
	private void startGame() {
		ventana.startGame();
	}

	/**
	 * Cambia el skin
	 */
	private void cambiarSkin() {

		String path = "/resources/SpriteSheets/" + cboSkins.getSelectedItem() + ".png";
		if (cboSkins.getSelectedItem() == "Default") Data.SPRITE_SIZE = 32;
		else Data.SPRITE_SIZE = 25;
		Data.SPRITE_SHEET = new SpriteSheet(loader.loadImage(path));

		if (robot == 1) botonMilitar();
		else botonCivil();

	}

	/**
	 * Devuelve el path completo del nivel seleccionado
	 * @return String con el path
	 */
	public String getNivel() {
		return "/resources/Niveles/" + cboNiveles.getSelectedItem() + ".txt";
	}

	/**
	 * Carga un archivo y lo guarda en el atributo archivo
	 */
	private void cargarArchivo() {

		JFileChooser chooser = new JFileChooser(".//Niveles");
		FileNameExtensionFilter filter = new FileNameExtensionFilter("*.txt", "txt");
		chooser.setFileFilter(filter);
		int respuesta = chooser.showOpenDialog(chooser);
		if (respuesta == JFileChooser.APPROVE_OPTION) {
			cargoDeArchivo = true;
			archivo = chooser.getSelectedFile();
			cboNiveles.setSelectedIndex(3);
			lblArchivo.setText(archivo.getName());
		}

	}

	public boolean cargoDeArchivo() {
		return cargoDeArchivo;
	}

	public File getArchivo() {
		return archivo;
	}

}
